
--[[
描述 ： UINewsShowView新闻展示页子视图控件 tabs
作者 ： Joshua
时间 ： 14/07/15
注意：此类不作为单独控件使用 作用于UINewsShowView
]]
UINewsShowTabsView = Class(MLView,'UINewsShowTabsView')
UINewsShowTabsView.width      = nil;    --宽
UINewsShowTabsView.height       = nil;    --高
UINewsShowTabsView.parent       = nil;    --父视图控件
UINewsShowTabsView.vCurline     = nil;    --视图 游标线
UINewsShowTabsView.vItems       = nil;    --视图 字符串
UINewsShowTabsView.vContainer     = nil;    --视图 装载游标、字符串
UINewsShowTabsView.vScroll      = nil;    --视图 装载vContainer

UINewsShowTabsView.rCurline     = {};   --游标线 信息
UINewsShowTabsView.rItems     = {};   --字符串 信息
--[[
功能： UINewsShowTabsView视图控件初始化函数
参数： width   宽
height  高
parent  父视图控件
viewCtrl 所在ctrl
id    空间id
返回： UINewsShowTabsView视图控件实例化
]]
function UINewsShowTabsView:init( width, height, parent, viewCtrl, id )
  --local dw, dh =  MLNative.getScreen():getWH();
  local dw, dh = viewCtrl.rootView:getWH();
  self.width = width or dw;
  self.height = height or AW(45);

  self.parent = parent;
  self.viewCtrl = viewCtrl;
  self.id = id;

  self:initView(self.width, self.height, viewCtrl, self.id);

  self.vScroll = UIScrollView.new():init( self.width, self.height, true, self.viewCtrl,self.id);
  self.vScroll:setBarsHidden( true );
  self:add(self.vScroll);

  self.vContainer = MLView.new():initView( 0, 0, viewCtrl, self.id);
  self.vScroll:add(self.vContainer, 0, 0);

  return self;
end
--[[
功能： 根据文字信息、父视图的数据初始化 视图信息
参数： 无
返回： 无
注：  当更改视图信息后，需要重新初始化一次
]]
function UINewsShowTabsView:initRcord(  )
  if not self.texts or #self.texts == 0 then
    return
  end

  self.rItems = {};
  self.rCurline = {};
  self.rCurline.height = self.parent.cursorLineHeight or  UITheme.NEWSSHOWVIEW_CURSOR_LINE_HEIGHT;
  self.rItems.width   = 0;
  self.rItems.height  = self.height - self.rCurline.height;
  self.rItems.font      = self.parent.barfont or MLNative.Style_Common;
  self.rItems.fontHeight    = self.parent.barfontHeight or UITheme.NEWSSHOWVIEW_FONT_HEIGHT;
  self.rItems.fontColor     = self.parent.barfontColor or  UITheme.NEWSSHOWVIEW_FONT_COLOR;
  self.rItems.fontColorFocus  = self.parent.barfontFocusColor or UITheme.NEWSSHOWVIEW_FONT_COLOR_FOCUS;

  local index,tempX,texts= 0, 0, self.texts;
  for index = 1,#texts do
    local bounds = {};
    bounds.text  = texts[index];
    bounds.textW = MLNative.measStringWidth(texts[index], self.rItems.fontHeight, self.rItems.font );
    bounds.textH = MLNative.measStringHeight(texts[index], self.rItems.fontHeight, self.rItems.font,9999 );
    --print('zzz====', self.rItems.fontHeight,self.rItems.font,bounds.textW,bounds.textH)
    bounds.textX = AW(5);
    bounds.textY = (self.rItems.height - bounds.textH)/2

    bounds.width = bounds.textW + AW(10);
    bounds.y   = 0;
    bounds.x   = tempX;

    tempX = tempX + bounds.width;

    self.rItems[index] = bounds;
    self.rItems.width = self.rItems.width + bounds.width;
  end

  self.rCurline.width = self.rItems.width;
  self.rCurline.lineColor = self.parent.cursorColor or UITheme.NEWSSHOWVIEW_CURSOR_CLOROR;
end
--[[
功能： 根据参数设置游标线
参数： x 游标线横坐标
y 游标线纵坐标
w 游标线宽
h 游标线高
返回： 无
]]
function UINewsShowTabsView:scrollLine( x, y, w, h )
  self.rCurline.lineX = x;
  self.rCurline.lineY = y;
  self.rCurline.lineW = w;
  self.rCurline.lineH = h or self.rCurline.h;

  self:draw_vCurline();
end
--[[
功能： 根据pager的滑动，滑动游标,滑动items等
参数： index int；offset int：    第index个页面的左边线距离屏幕左边 的距离为 width*per
返回： 无
]]
function UINewsShowTabsView:scrollTabs( index,per )
--print('iiiii==',index,#self.rItems )
  if index == #self.texts then
    return
  end
  if index > #self.rItems then
  
  return
  end
  local Wi = self.rItems[index].width;
  local Xi = self.rItems[index].x;
  local Ws1 = self.rItems[index - 1].width;
  local Xs1 = self.rItems[index - 1].x;
  local dstW,dstX,srcW,srcX;

  --右移
  if index == self.curIndex then
    dstW,dstX,srcW,srcX = Ws1,Xs1,Wi,Xi;

    self:scrollLine(
      srcX + (dstX - srcX)*per,
      0,
      srcW + (dstW - srcW)*per,
      self.rCurline.height );

  else --左移
    dstW,dstX,srcW,srcX = Wi,Xi,Ws1,Xs1;

    self:scrollLine(
      srcX + (dstX - srcX)*(1 - per),
      0,
      srcW + (dstW - srcW)*(1 - per),
      self.rCurline.height );
  end
end
--[[
功能： 设置TabBar 文字，并设置刷新视图信息标志 为true
参数： texts 字符串数组
返回： 无
]]
function UINewsShowTabsView:setItemTexts( texts )
  self.texts = texts;
  self.rItems = {};
  self.rItems.needReCal = true;
end
--[[
功能： 绘画函数；用于绘画控件视图
参数： 无
返回： 无
]]
function UINewsShowTabsView:draw(  )
  if not self.parent.pageViews or #self.parent.pageViews ~= #self.texts then
    --print('err!','UINewsShowView实例setViews(...)与setTabBarText(...)的个数不同！');
    return;
  end

  if not self.rItems or self.rItems.needReCal then
    self:initRcord();
    self.vContainer:delAll();
    self.vContainer:setWH( self.rItems.width,self.height);
    self.vContainer:setXY(0,0);
    self.vItems = MLView.new():initView(self.rItems.width, self.rItems.height, self.viewCtrl);
    self.vCurline = MLView.new():initView(self.rCurline.width, self.rCurline.height, self.viewCtrl);
    self.vContainer:add(self.vItems, 0, 0);
    self.vContainer:add(self.vCurline, 0, self.rItems.height);

    self.vItems.onPoint = function (evt, x, y)
      if evt == MLView.PointDown then
        self.valid = true;
        self.downX = x;
        self.downY = y;
      elseif evt == MLView.PointMove then
        if math.abs(self.downX - x) > 5 or math.abs(self.downY - y) > 5 then
          self.valid = false;
        end
      elseif evt == MLView.PointUp then
        if self.valid then
          self:selItemFromPoint(x);
        end
      elseif evt == MLView.PointCANCEL then
      end

      return 1;
    end
    self.rItems.needReCal = false
  end

  if not self.curIndex then
    self:setCurTab( 1 );
    return
  end
  self:draw_vItems();
  self:draw_vCurline();
end
--[[
功能: 重绘 vItems 视图
参数： 无
返回： 无
]]
function UINewsShowTabsView:draw_vItems(  )

  if not self.parent.pageViews or #self.parent.pageViews ~= #self.texts then
    --print('err!','UINewsShowView实例setViews(...)与setTabBarText(...)的个数不同！');
    return
  end


  local g = self.vItems:getGraphic();
  g:clear();

  local R = self.rItems;
  if self.parent.barBgColor then
    g:fillRect(0, 0, R.width, R.height, self.parent.barBgColor );
  end

  local i;
  for i = 1,#R do
    local r = R[i];
    if self.curIndex == i then
      g:drawString(r.text, r.x + r.textX, r.textY, R.fontColorFocus, R.fontHeight, R.font );
    else
      g:drawString(r.text, r.x + r.textX, r.textY, R.fontColor, R.fontHeight, R.font );
    end
  end
end
--[[
功能: 重绘游标线 vCurline 视图
参数： 无
返回： 无
]]
function UINewsShowTabsView:draw_vCurline(  )

  if not self.parent.pageViews or #self.parent.pageViews ~= #self.texts then
   -- print('err!','UINewsShowView实例setViews(...)与setTabBarText(...)的个数不同！');
    return
  end


  local g = self.vCurline:getGraphic();
  g:clear();

  local R = self.rCurline;
  if self.parent.barBgColor then
    g:fillRect(0, 0, R.width, R.height, self.parent.barBgColor );
  end
  g:fillRect(R.lineX, R.lineY, R.lineW, R.lineH, R.lineColor,2)
end

--[[
功能: 根据vItems视图的点击事件获得的x坐标计算哪个item被点击了，及做出相应的处理
参数： x 点击事件的x坐标
返回： 无
]]
function UINewsShowTabsView:selItemFromPoint( x )
  local i,sumX = 0, 0;
  local TB = self.rItems;
  for i = 1,#TB do
    --print(i,sumX)
    if x > sumX and x < sumX + TB[i].width then
      if self.parent then
        self.curIndex = i;
        self.parent:setSelItem( i );
      end
      self:draw();
      return
    else
      sumX = sumX + TB[i].width;
    end
  end
end
--[[
功能： 根据索引设置选中tab中相应的item
参数： index int   选中的序号
返回： 无
]]
function UINewsShowTabsView:setCurTab( index )
  if index then
    local curX = self.rItems[index].x;
    local curWidth = self.rItems[index].width;
    local baseX = self.vScroll:getScrollPos();
    self.curIndex = index;
    self:draw_vItems();

    self:scrollLine( curX, 0, curWidth, self.rCurline.height );
    self:needsScroll( curX, curWidth, baseX );
  end
end
--[[
功能： 判断当前是否需要移动滑动条
参数： x   需要显示的x坐标
w   需要显示的宽度
pos 当前滑动的位置
返回： 无
]]
function UINewsShowTabsView:needsScroll( x, w, pos )
  local tempPos;
  if w >= self.width then
    tempPos = x;
  elseif w > self.width*2/3 then
    if x < pos or x + w >pos + self.width then
      tempPos = x - (self.width - w)/2;
    end
  else
    if x < pos then
      tempPos = x - self.width/3
      if tempPos < 0 then
        tempPos = 0;
      end
    end
    if x + w > pos + self.width then
      tempPos = x - self.width/3
      if tempPos > self.rItems.width - self.width then
        tempPos = self.rItems.width - self.width
      end
    end
  end
  if tempPos then
    self.vScroll:setScrollPos(tempPos);
  end
end
--[[
功能   ： 刷新并显示控件
参数   ： 无
返回   ： 无
]]
function UINewsShowTabsView:show()
  self.rItems= {};
  self.rCurline = {};
  self.rItems.needReCal = true;
  self:draw();
end

--CLASS_END(UINewsShowTabsView);